Store the position of the file part and use that in
authorOwen Taylor <otaylor@redhat.com>
Mon, 15 Mar 2004 17:11:28 +0000 (17:11 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Mon, 15 Mar 2004 17:11:28 +0000 (17:11 +0000)
Mon Mar 15 11:40:43 2004  Owen Taylor  <otaylor@redhat.com>

        * gtk/gtkfilechooserentry.c: Store the position of the
        file part and use that in check_completion_callback()
        and match_selected_callback() to figure out where
        to operate on the text, rather than recomputing the
        information.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkfilechooserentry.c

index 54c6f2ab07135eaa11dcc2a1635a48423b653102..e31fb3d648d2616fd9b4f36258fc649beb9422b8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Mon Mar 15 11:40:43 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkfilechooserentry.c: Store the position of the 
+       file part and use that in check_completion_callback()
+       and match_selected_callback() to figure out where
+       to operate on the text, rather than recomputing the
+       information.
+
 Mon Mar 15 10:35:19 2004  Jonathan Blandford  <jrb@gnome.org>
 
        * gtk/gtkfilechooserdefault.c (shortcuts_add_volumes): set
index 54c6f2ab07135eaa11dcc2a1635a48423b653102..e31fb3d648d2616fd9b4f36258fc649beb9422b8 100644 (file)
@@ -1,3 +1,11 @@
+Mon Mar 15 11:40:43 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkfilechooserentry.c: Store the position of the 
+       file part and use that in check_completion_callback()
+       and match_selected_callback() to figure out where
+       to operate on the text, rather than recomputing the
+       information.
+
 Mon Mar 15 10:35:19 2004  Jonathan Blandford  <jrb@gnome.org>
 
        * gtk/gtkfilechooserdefault.c (shortcuts_add_volumes): set
index 54c6f2ab07135eaa11dcc2a1635a48423b653102..e31fb3d648d2616fd9b4f36258fc649beb9422b8 100644 (file)
@@ -1,3 +1,11 @@
+Mon Mar 15 11:40:43 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkfilechooserentry.c: Store the position of the 
+       file part and use that in check_completion_callback()
+       and match_selected_callback() to figure out where
+       to operate on the text, rather than recomputing the
+       information.
+
 Mon Mar 15 10:35:19 2004  Jonathan Blandford  <jrb@gnome.org>
 
        * gtk/gtkfilechooserdefault.c (shortcuts_add_volumes): set
index 54c6f2ab07135eaa11dcc2a1635a48423b653102..e31fb3d648d2616fd9b4f36258fc649beb9422b8 100644 (file)
@@ -1,3 +1,11 @@
+Mon Mar 15 11:40:43 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkfilechooserentry.c: Store the position of the 
+       file part and use that in check_completion_callback()
+       and match_selected_callback() to figure out where
+       to operate on the text, rather than recomputing the
+       information.
+
 Mon Mar 15 10:35:19 2004  Jonathan Blandford  <jrb@gnome.org>
 
        * gtk/gtkfilechooserdefault.c (shortcuts_add_volumes): set
index 54c6f2ab07135eaa11dcc2a1635a48423b653102..e31fb3d648d2616fd9b4f36258fc649beb9422b8 100644 (file)
@@ -1,3 +1,11 @@
+Mon Mar 15 11:40:43 2004  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkfilechooserentry.c: Store the position of the 
+       file part and use that in check_completion_callback()
+       and match_selected_callback() to figure out where
+       to operate on the text, rather than recomputing the
+       information.
+
 Mon Mar 15 10:35:19 2004  Jonathan Blandford  <jrb@gnome.org>
 
        * gtk/gtkfilechooserdefault.c (shortcuts_add_volumes): set
index b502bb34a212404deb5c5e791c755cade0044109..6431da94fb071cea5bb183cc4af0d830700fb571 100644 (file)
@@ -46,6 +46,7 @@ struct _GtkFileChooserEntry
   GtkFilePath *base_folder;
   GtkFilePath *current_folder_path;
   gchar *file_part;
+  gint file_part_pos;
   GSource *check_completion_idle;
   GSource *load_directory_idle;
 
@@ -233,12 +234,8 @@ match_selected_callback (GtkEntryCompletion  *completion,
                         GtkFileChooserEntry *chooser_entry)
 {
   char *display_name;
-  gint total_len;
-  gint file_part_len;
-  gint selected_part_len;
   GtkFilePath *path;
   gint pos;
-  const gchar *text;
   
   gtk_tree_model_get (model, iter,
                      DISPLAY_NAME_COLUMN, &display_name,
@@ -255,29 +252,7 @@ match_selected_callback (GtkEntryCompletion  *completion,
 
   display_name = maybe_append_separator_to_path (chooser_entry, path, display_name);
 
-  /* We have to jump through hoops to figure out where to append this to */
-  text = gtk_entry_get_text (GTK_ENTRY (chooser_entry));
-  total_len = g_utf8_strlen (text, -1);
-  file_part_len = g_utf8_strlen (chooser_entry->file_part, -1);
-
-  selected_part_len = 0;
-
-  if (chooser_entry->has_completion)
-    {
-      gint sel_start, sel_end;
-
-      /* Gosh, there should be a more efficient way of doing this... */
-      if (gtk_editable_get_selection_bounds (GTK_EDITABLE (chooser_entry),
-                                            &sel_start, &sel_end))
-       {
-         gchar *str = gtk_editable_get_chars (GTK_EDITABLE (chooser_entry),
-                                              sel_start, sel_end);
-         selected_part_len = g_utf8_strlen (str, -1);
-         g_free (str);
-       }
-    }
-
-  pos = total_len - (file_part_len + selected_part_len); 
+  pos = chooser_entry->file_part_pos;
 
   /* We don't set in_change here as we want to update the current_folder
    * variable */
@@ -470,18 +445,16 @@ check_completion_callback (GtkFileChooserEntry *chooser_entry)
 
   if (common_prefix)
     {
-      gint total_len;
       gint file_part_len;
       gint common_prefix_len;
       gint pos;
 
-      total_len = g_utf8_strlen (gtk_entry_get_text (GTK_ENTRY (chooser_entry)), -1);
       file_part_len = g_utf8_strlen (chooser_entry->file_part, -1);
       common_prefix_len = g_utf8_strlen (common_prefix, -1);
 
       if (common_prefix_len > file_part_len)
        {
-         pos = total_len - file_part_len;
+         pos = chooser_entry->file_part_pos;
 
          chooser_entry->in_change = TRUE;
          gtk_editable_delete_text (GTK_EDITABLE (chooser_entry),
@@ -490,8 +463,8 @@ check_completion_callback (GtkFileChooserEntry *chooser_entry)
                                    common_prefix, -1, 
                                    &pos);
          gtk_editable_select_region (GTK_EDITABLE (chooser_entry),
-                                     total_len,
-                                     total_len - file_part_len + common_prefix_len);
+                                     chooser_entry->file_part_pos + file_part_len,
+                                     chooser_entry->file_part_pos + common_prefix_len);
          chooser_entry->in_change = FALSE;
 
          chooser_entry->has_completion = TRUE;
@@ -755,6 +728,8 @@ gtk_file_chooser_entry_changed (GtkEditable *editable)
   const gchar *text;
   GtkFilePath *folder_path;
   gchar *file_part;
+  gsize total_len, file_part_len;
+  gint file_part_pos;
 
   if (chooser_entry->in_change)
     return;
@@ -771,12 +746,20 @@ gtk_file_chooser_entry_changed (GtkEditable *editable)
       file_part = g_strdup ("");
     }
 
+  file_part_len = strlen (file_part);
+  total_len = strlen (text);
+  if (total_len > file_part_len)
+    file_part_pos = g_utf8_strlen (text, total_len - file_part_len);
+  else
+    file_part_pos = 0;
+
   gtk_file_chooser_entry_maybe_update_directory (chooser_entry, folder_path);
 
   if (chooser_entry->file_part)
     g_free (chooser_entry->file_part);
 
   chooser_entry->file_part = file_part;
+  chooser_entry->file_part_pos = file_part_pos;
 }
 
 static void